home *** CD-ROM | disk | FTP | other *** search
- ;-------------------------------------------------------------
- ;FileName: DoHelp.Asm
- ;(C) 1988 by John Holder
- ;-------------------------------------------------------------
- ;What it does:
- ;A generic Help routine:
- ;Allows user to click in a list of names (these names are
- ;actually the names of 'help' resources), and show the data
- ;contained in this resource (ACSII text), in a scrollable
- ;window. Nothing about the dialog (other than its id#) is
- ;known, so the dialog can be modified without changing this
- ;code. To make topics for your help routine, just create
- ;NAMED resources of type 'help' (lowercase) in your
- ;application starting at id#1 and making each id# one more
- ;than the last one. To create the appearance of subtopics
- ;just add a few spaces to the beginning of the names of
- ;the appropriate 'help' resources.
-
- ;To use this in your application, just make sure you:
- ;XREF DoHelp
- ;at the beginning of your source code and you call it by
- ;doing a:
- ; BSR DoHelp
- ;in the appropriate place in your code
-
-
- Include Traps.D ; Traps
- Include ToolEqu.D ; ToolBox equates
- Include SysEqu.D ; System equates
- Include FSEqu.D ; File equates
- Include PackMacs.Txt ; PACKage mgr equates
- Include QuickEqu.D ; QDraw equates
-
-
- MACRO SaveRegs =
- MOVEM.L A0-A4/D0-D7,-(SP)
- |
-
- MACRO RestoreRegs =
- MOVEM.L (SP)+,A0-A4/D0-D7
- |
-
-
- true equ $0100
- false equ 0
- nil equ 0
-
- arraycolumns equ 1
- arrayrows equ 0
-
- celldepth equ 16 ;depth of Cells in List
-
- modify EQU 14 ;State of keys and button
- message equ 2 ;Message returned in EventRecord
-
- DialogID equ 2000 ;res id# of DLOG resource
-
-
-
- XDEF DoHelp ;Define function DoHelp for Linker
-
-
- ;-------------------------------------------------------------
- ; <<<< The beginning of the DoHelp routine >>>>
- ;-------------------------------------------------------------
- DoHelp
- saveregs
-
- CLR.L -(SP) ;space for ptr
- move.w #DialogID,-(sp)
- CLR.L -(SP) ;wstorage
- MOVE.L #-1,-(SP)
- _GetNewDialog
- MOVE.L (SP),DialogPtr(A5) ;save ptr
- _SetPort
-
- ;set up stack for my routine
- move.l DialogPtr(A5),-(sp)
- move #1,-(sp)
- bsr HilightDialogButton
-
- ;Set up list of all 'help' resources
- bsr SetUpHelpList
-
- _InitCursor
-
-
- Dialog_Loop
- pea DialogsFilter ;use filter to watch
- pea ItemNumber(A5) ;for List mgr events
- _ModalDialog
-
- WhatsTheHaps21
- ;which item was clicked
- cmp.w #1,ItemNumber(A5)
- beq Quit_Help ;click in 'Done..' but
-
- bra Dialog_Loop ;loop until done
-
-
- Quit_Help
- ;all done, lets get outta here!
- ;dispose of the List handle
- move.l ListHandle(A5),-(sp)
- _LDispose
-
- ;kill the dialog
- move.l DialogPtr(A5),-(sp)
- _DisposDialog
-
- ;return to calling application!
- restoreregs
- rts
-
-
-
-
-
-
- ;-------------------------------------------------------------
- ;<< Dialog Filter to watch for list selections in User Item >>
- ;-------------------------------------------------------------
- DialogsFilter
- ;this routine expects parameters to be on the stack (handled
- ;by _ModalDialog)
- ;PROCEDURE
- ;DialogsFilter (thedialog:dialogptr;VAR theEvent:EventRecord
- ; VAR itemhit:integer): boolean
-
-
- Parambytes SET 12
- tItemHit SET 8 ;a ptr to an int!
- tEvent SET 12 ;event rec
- tDialog SET 16 ;dialog ptr
- result SET 20 ;result returned
-
- iPoint SET -4 ;mouse point
- itype SET -6 ;item type
- iHdl SET -10 ;item hand
- iBox SET -18 ;item rect
- localbytes SET -18
-
- link A6,#localbytes
- saveregs
-
- ;get User Item info (rect)
- move.l tDialog(A6),-(sp)
- move #2,-(sp)
- pea iType(A6)
- pea iHdl(A6)
- pea iBox(A6)
- _GetDItem
-
- move.l tevent(A6),A0
- move evtnum(A0),D0
- cmp #KeyDwnEvt,D0 ;was it a key down?
- beq CheckForEnterorReturn ;yep!
-
- move.l tevent(A6),A0
- move evtnum(A0),D0
- cmp #mButDwnEvt,D0 ;was it a mouse down?
- bne LetDialogHandleIt ;if not, let
- ;_ModalDialog
- ;handle
-
- ;was it a mouse click in the List Box (User Item)?
- lea evtMouse(A0),A0
- lea iPoint(A6),A1
- move.l (A0)+,(A1)+
-
- pea iPoint(A6)
- _GlobalToLocal
-
- clr -(sp)
- move.l iPoint(A6),-(sp)
- pea iBox(A6)
- _PtInRect
- move (sp)+,D0
- beq LetDialogHandleIt ;not in user item
-
- bsr HandleListEvent ;handle list event!
-
- ;we've taken care of the event
- move.l tItemHit(A6),A0
- move #nil,(A0) ;set itemhit to nil
-
- move #true,result(A6) ;stop _ModalDialog
- bra FilterExit ;from handling!
-
- LetDialogHandleIt
- move #nil,result(A6)
-
- FilterExit
- ;restore stack to the way it was before
- ;and return
- restoreregs
- unlk A6
- move.l (sp)+,A0
- adda #parambytes,SP
- jmp (A0) ;rts
-
-
-
- ;-------------------------------------------------------------
- ; <<<< Check for Return or Enter key press >>>>
- ;-------------------------------------------------------------
- CheckForEnterorReturn
- ;if the Enter or Return key was pushed, set the itemhit to #1
- ;and set result to false so it will be handled by _ModalDialog
-
- move.l tevent(A6),A0
- move.l message(A0),D0
-
- cmp.b #$0d,D0 ;return key?
- beq SetResult ;yep!
- cmp.b #$03,D0 ;Enter key?
- beq SetResult ;yep!
- bra LetDialogHandleIt ;neither key
-
- SetResult
- move.l tItemHit(A6),A0
- move #1,(A0) ;set itemhit to 1
- move #true,result(A6) ;let _ModalDialog
- ;handle it
- bra FilterExit
-
-
-
-
- ;-------------------------------------------------------------
- ; <<<< Click in List box! >>>>
- ;-------------------------------------------------------------
- ;handle a click in the list box area
- HandleListEvent
-
- ;_LClick will handle scrolling & selection of list
- ;items
- pea iPoint(A6)
- _GetMouse
- clr -(sp)
- move.l iPoint(A6),-(sp)
- move tEvent+Modify(A6),-(sp)
- move.l listhandle(A5),-(sp)
- _LClick
- move (sp)+,D0
-
- clr.l TheCell(A5) ;start at cell 0,0
- ;for _LGetSelect
- clr -(sp)
- move #true,-(sp)
- pea TheCell(A5)
- move.l listhandle(A5),-(sp)
- _LGetSelect
- move (sp)+,D0
- beq Click_Not_In_Cell ;no cell selected
-
- ;unselect the selected cell
- move #false,-(sp)
- move.l TheCell(A5),-(sp)
- move.l listhandle(A5),-(sp)
- _LSetSelect
-
- ;de-activate the list
- move #false,-(sp)
- move.l listhandle(A5),-(sp)
- _LActivate
-
- bsr Erase_Rect ;clear topic list
- bsr Set_To_DoneViewing ;change button name
- bsr GetandSetWatch ;show watch cursor
- bsr Do_Help_View ;show text from
- ;'help' res
-
- ;re-activate the list
- move #true,-(sp)
- move.l listhandle(A5),-(sp)
- _LActivate
-
- Click_Not_In_Cell
- rts
-
-
-
- ;-------------------------------------------------------------
- ; <<<< Show the user selected help text >>>>
- ;-------------------------------------------------------------
- ;open the named resource and view its contents
- Do_Help_View
-
- ;Use all of rect except enough room for scroll bar
- ;for text window
- bsr Get_Rect_Of_Item
- lea DispRect(A5),A2
- sub #16,Right(A2)
-
- ;create new Text edit record
- clr.l -(sp)
- pea DispRect(A5)
- pea DispRect(A5)
- _TENew
- move.l (sp)+,TextHand(A5) ;store handle
-
- ;set TE rec. text to 9 point Monaco
- move.l TextHand(A5),A1
- move.l (A1),A1
- move #9,teSize(A1) ;Text Size!
-
- move.l TextHand(A5),A1
- move.l (A1),A1
- move #Monaco,teFont(A1) ;Text Font!
-
- bsr Frame_The_Rect
-
- bsr Get_Rect_Of_Item
-
- ;figure rectangle for scroll bar!
- lea DispRect(A5),A2
- move Right(A2),D2
- sub #15,D2 ;scroll bar width
- move D2,Left(A2) ;left = right - 15
- add #1,Right(A2) ;right = right + 1
- ;we de because the
- ;text rect is 1
- ;pixel inside the
- ;User Item's rect
-
- pea DispRect(A5) ;expand top & bottom
- move #0,-(sp) ;of rect by 1 pixel
- move #-1,-(sp)
- _InsetRect
-
- ;create scroll bar!
- clr.l -(sp)
- move.l DialogPtr(A5),-(sp)
- pea DispRect(A5) ;scrolls rect
- move.l #nil,-(sp)
- move #true,-(sp) ;visible
- move #0,-(sp) ;init value
- move #0,-(sp) ;min value
- move #0,-(sp) ;max value(start at 0)
- move #16,-(sp) ;proc id (16=scroll)
- clr.l -(sp) ;refCon
- _NewControl
- move.l (sp)+,ScrollHand(A5) ;save handle
-
- move #255,DataLength(A5) ;max length of
- ;data allowed
- ;Get the selected cells data
- lea AString(A5),A0 ;pt to byte after
- add.l #1,A0 ;length byte
- move.l A0,-(sp) ;put ptr on stack
- pea DataLength(A5) ;data length var
- move.l TheCell(A5),-(sp)
- move.l ListHandle(A5),-(sp)
- _LGetCell
-
- ;add length of data to String ptr
- lea ASTring(A5),A0
- move DataLength(A5),D0
- move.b D0,(A0)
-
- ;get the res. & load it
- clr.l -(sp)
- move.l #'help',-(sp)
- pea AString(A5)
- _GetNamedResource
- move.l (sp),ResHand(A5)
- _LoadResource
-
- ;just to make sure the resource exists!
- move.l ResHand(A5),A0
- cmp.l #nil,A0 ;does res. exist?
- bne A_Ok ;yep,it's there, go on
- bsr DumpStuff ;no such resource!
- rts ;return
-
- A_Ok
- move.l ResHand(A5),A0 ;lock handle
- _HLock
-
- ;size of handle (text data)
- move.l ResHand(A5),A0
- _GetHandleSize
- move.l D0,D2 ;D2 = length of text data
-
- ;set up Text Edit Record to use 'help' data
- move.l ResHand(A5),A0 ;need text ptr
- move.l (A0),-(sp) ;convert handle
- move.l D2,-(sp) ;text length
- move.l TextHand(A5),-(sp)
- _TESetText
-
- move.l ResHand(A5),A0 ;unlock handle
- _HUnLock
-
- ;see how many lines of text are in the
- ;'help' data
- move.l TextHand(A5),A1
- move.l (A1),A1
- move tenLines(A1),d3 ;D3= lines of text!
-
- ;see how many lines fit into rect of user
- ;item of dialog box
- bsr Calc_Lines_In_One_Windowful
- move LinesInWind(A5),D1
- sub D1,D3 ;sub enough for a
- cmp #nil,D3 ;window full!
- ble Wont_Pass_Bottom ;not enough lines
- ;to adda scroll bar
-
- ;set the scroll bars max value by the # of lines
- move.l ScrollHand(A5),-(sp)
- move D3,-(sp) ;# of lines
- _SetMaxCtl
-
- Wont_Pass_Bottom
- ;update the text
- pea DispRect(A5)
- move.l TextHand(A5),-(sp)
- _TEUpDate
-
- _InitCursor
-
- ;go watch for text events
- bsr HandleTextEditDialogEvent
-
- rts ;done with the text, return
-
-
-
-
- ;-------------------------------------------------------------
- ;<<<< Handle events in Dialog box (with text scrolling)! >>>>
- ;-------------------------------------------------------------
- HandleTextEditDialogEvent
- saveregs
-
- D_Loop
- pea CheckTextScroll ;filter to watch
- pea ItemNumber(A5) ;for text scrolling
- _ModalDialog
-
- ;check which buttons are clicked here
- cmp.w #1,ItemNumber(A5)
- beq Done_With_This ;done viewing text
-
- ;if ItemNumber(A5) = 2, that means the user
- ;clicked in the content of the text of the dialog
- ;which is handled the same as clicked the
- ;'Done Viewing' button
- cmp.w #2,ItemNumber(A5)
- beq Done_With_This ;done viewing text
- bra D_Loop ;keep looping
-
-
-
- ;-------------------------------------------------------------
- ; <<<< Finished here with text view >>>>
- ;-------------------------------------------------------------
- Done_With_This
- bsr DumpStuff
- restoreregs
- rts
-
-
-
- ;-------------------------------------------------------------
- ; <<<< Dump TE rec. & scroll bar >>>>
- ;-------------------------------------------------------------
- DumpStuff
- ;dispose of text edit record
- move.l TextHand(A5),-(sp)
- _TEDispose
-
- ;dispose of Scroll bar
- move.l ScrollHand(A5),-(sp)
- _DisposControl
-
- bsr Erase_Rect ;erase the rect
-
- ;reset text font & size to System values
- move #12,-(sp) ;12 point
- _TextSize
-
- move #0,-(sp) ;Use System Font
- _TextFont
-
- ;re-show the list by causing list update
- MOVE.L DialogPtr(A5),A1
- move.l 24(A1),-(sp)
- move.l ListHandle(A5),-(sp)
- _LUpdate
-
- bsr Frame_The_Rect ;re-frame list rect
-
- bsr Set_To_DoneWithHelp
- rts
-
-
-
- ;-------------------------------------------------------------
- ; <<<< Dialog Filter to watch for text scrolling >>>>
- ;-------------------------------------------------------------
- CheckTextScroll
- ;this routine expects parameters to be on the stack (set up
- ;by _ModalDialog)
- ;PROCEDURE
- ;CheckTextScroll (thedialog:dialogptr;VAR theEvent:EventRecord
- ; VAR itemhit:integer): boolean
-
-
- Parambytes SET 12
- tItemHit SET 8 ;a ptr to an int!
- tEvent SET 12 ;event rec
- tDialog SET 16 ;dialog ptr
- result SET 20 ;result returned
-
- iPoint SET -4 ;mouse point
- itype SET -6 ;item type
- iHdl SET -10 ;item hand
- iBox SET -18 ;item rect
- PartCode set -20 ;used for scroll
- localbytes SET -20
-
- link A6,#localbytes
- saveregs
-
- move.l tDialog(A6),-(sp)
- move #2,-(sp)
- pea iType(A6)
- pea iHdl(A6)
- pea iBox(A6)
- _GetDItem
-
- ;only rect in user item will be scroll bar that
- ;this dialog filter handles
- lea iBox(A6),A2
- move Right(A2),D2
- sub #16,D2 ;scroll bar width
- move D2,Left(A2) ;left = right - 16
-
- move.l tevent(A6),A0
- move evtnum(A0),D0
- cmp #KeyDwnEvt,D0 ;was it a key down?
- beq CheckForEnterorReturn2 ;yep!
-
- move.l tevent(A6),A0
- move evtnum(A0),D0
- cmp #mButDwnEvt,D0 ;was it a mouse down?
- bne LetDialogHandleIt2 ;if not, let
- ;_ModalDialog
- ;handle
-
- ;change mouse pt into local coordinates
- lea evtMouse(A0),A0
- lea iPoint(A6),A1
- move.l (A0)+,(A1)+
-
- pea iPoint(A6)
- _GlobalToLocal
-
- ;was it a mouse click in the Text Box scroll
- ;bar (User Item)?
- clr -(sp)
- move.l iPoint(A6),-(sp)
- pea iBox(A6)
- _PtInRect
- move (sp)+,D0
- beq LetDialogHandleIt2 ;not in scroll,
- ;let dialog handle
-
- bsr HandleScroll ;go handle text
- ;scroll event!
-
- ;we've taken care of the event
- move.l tItemHit(A6),A0
- move #nil,(A0) ;set itemhit to nil
-
- move #true,result(A6) ;set result to true,
- bra FilterExit2 ;stop _ModalDialog
- ;from handling
-
-
- LetDialogHandleIt2
- move #nil,result(A6) ;set to nil, let
- ;_ModalDialog handle
- ;it
- FilterExit2
- ;get out of the routine here!
- restoreregs
- unlk A6
- move.l (sp)+,A0
- adda #parambytes,SP
- jmp (A0) ;rts
-
-
- ;-------------------------------------------------------------
- ; <<<< Check for Return or Enter key press >>>>
- ;-------------------------------------------------------------
- CheckForEnterorReturn2
- ;if the Enter or Return key was pushed set the itemhit to #1
- ;and set result to false so it will be handled!
-
- move.l tevent(A6),A0
- move.l message(A0),D0
-
- cmp.b #$0d,D0 ;return key?
- beq SetResult2 ;yep!
- cmp.b #$03,D0 ;Enter key?
- beq SetResult2 ;yep!
- bra LetDialogHandleIt2 ;neither key
-
- SetResult2
- move.l tItemHit(A6),A0
- move #1,(A0) ;set itemhit to 1
- move #true,result(A6) ;let modaldialog
- bra FilterExit2 ;handle it
-
-
-
-
- ;-------------------------------------------------------------
- ;-------------------------------------------------------------
- ; <<<< ALL text scrolling routines >>>>
- ;-------------------------------------------------------------
- ;-------------------------------------------------------------
-
- ;-------------------------------------------------------------
- ; <<<< Click in Text Scroll bar >>>>
- ;-------------------------------------------------------------
- HandleScroll
- pea iPoint(A6)
- _GetMouse
-
- clr -(sp)
- move.l iPoint(A6),-(sp)
- move.l DialogPtr(A5),-(sp)
- pea WhichControl(A5)
- _FindControl
- move (sp)+,PartCode(A6)
- beq ScrollDone ;not in any control
-
- ;was click in the scroll bar?
- ;compare value returned by _FindControl & the
- ;scrolls handle we have stored, if they are
- ;equal then do the scroll routines
- move.l ScrollHand(A5),D0
- move.l WhichControl(A5),D1
- cmp.l D0,D1
- beq Click_In_Scroll
- bra ScrollDone ;click not in scroll
-
-
- Click_In_Scroll
- ;which part of scroll?
- cmp #inUpButton,PartCode(A6)
- beq DoUpSCroll
- cmp #inDownButton,PartCode(A6)
- beq DoDownSCroll
- cmp #inPageUp,PartCode(A6)
- beq DoPageUpSCroll
- cmp #inPageDown,PartCode(A6)
- beq DoPageDownSCroll
- cmp #inThumb,PartCode(A6)
- beq DoThumb
- bra ScrollDone
-
-
- ;handle different parts of scroll
- DoUpSCroll
- clr -(sp)
- move.l WhichControl(A5),-(sp)
- move.l iPoint(A6),-(sp)
- pea UpActionProc
- _TrackControl
- move (sp)+,D0
- bra ScrollDone
-
- DoDownSCroll
- clr -(sp)
- move.l WhichControl(A5),-(sp)
- move.l iPoint(A6),-(sp)
- pea DownActionProc
- _TrackControl
- move (sp)+,D0
- bra ScrollDone
-
- DoPageUpSCroll
- clr -(sp)
- move.l WhichControl(A5),-(sp)
- move.l iPoint(A6),-(sp)
- pea PageUpActionProc
- _TrackControl
- move (sp)+,D0
- bra ScrollDone
-
- DoPageDownSCroll
- clr -(sp)
- move.l WhichControl(A5),-(sp)
- move.l iPoint(A6),-(sp)
- pea PageDownActionProc
- _TrackControl
- move (sp)+,D0
- bra ScrollDone
-
-
- ;handle click in thumb of control
- DoThumb
- clr -(sp)
- move.l WhichControl(A5),-(sp)
- _GetCtlValue
- move (sp)+,D4 ;D4 = old control value
-
- clr -(sp)
- move.l WhichControl(A5),-(sp)
- move.l iPoint(A6),-(sp)
- clr.l -(sp)
- _TrackControl
- move (sp)+,D0
-
- clr -(sp)
- move.l WhichControl(A5),-(sp)
- _GetCtlValue
- move (sp)+,D3 ;D3 = new cntl value
-
- sub D3,D4 ;D4-D3=new view value
- move D4,D6
- bsr Scroll_The_Text ;scroll text selected
- ;spot
-
- bra ScrollDone
-
-
- ;return from HandleScroll
- ScrollDone
- rts
-
-
-
- ;-------------------------------------------------------------
- ; <<<< Handle Up Scroll arrow >>>>
- ;-------------------------------------------------------------
- UpActionProc
- ;offsets into A6 stack
- thecontrol set 10
- pcode set 8
- parambytes set 6
-
- link A6,#0
- saveregs
-
- tst pcode(A6)
- beq UpActionDone
-
- clr -(sp)
- move.l WhichControl(A5),-(sp)
- _GetCtlValue
- move (sp)+,D1
- beq UpActionDone ;do nothing if control
- ;value is already 0
-
- sub #1,D1 ;sub 1 from scroll val
-
- move.l WhichControl(A5),-(sp)
- move D1,-(sp)
- _SetCtlValue ;set to new value
-
- move #1,D6 ;d6 = how many lines
- bsr Scroll_The_Text ;to scroll!
-
- UpActionDone
- restoreregs
- unlk A6
- move.l (sp)+,A1
- adda.w #parambytes,SP
- jmp (a1) ;rts
-
-
- ;-------------------------------------------------------------
- ; <<<< Handle Down Scroll arrow >>>>
- ;-------------------------------------------------------------
- DownActionProc
- ;offsets into A6 stack
- thecontrol set 10
- pcode set 8
- parambytes set 6
-
- link A6,#0
- saveregs
-
- tst pcode(A6)
- beq DownActionDone
-
- clr -(sp)
- move.l WhichControl(A5),-(sp)
- _GetCtlValue
- move (sp)+,D2
-
- add #1,D2 ;add 1 to scroll val
-
- clr -(sp)
- move.l WhichControl(A5),-(sp)
- _GetMaxCtl
- move (sp)+,D1
-
- ;don't scroll past controls max setting!
- cmp D1,D2
- bgt DownActionDone
-
- move.l WhichControl(A5),-(sp)
- move D2,-(sp)
- _SetCtlValue
-
- move #-1,D6 ;d6 = how many lines
- bsr Scroll_The_Text ;to scroll!
-
- DownActionDone
- restoreregs
- unlk A6
- move.l (sp)+,A1
- adda.w #parambytes,SP
- jmp (a1) ;rts
-
-
-
- ;-------------------------------------------------------------
- ; <<<< Handle PageUp Scroll arrow >>>>
- ;-------------------------------------------------------------
- PageUpActionProc
- ;offsets into A6 stack
- thecontrol set 10
- pcode set 8
- parambytes set 6
-
- link A6,#0
- saveregs
-
- tst pcode(A6)
- beq PageUpActionDone
-
- clr -(sp)
- move.l WhichControl(A5),-(sp)
- _GetCtlValue
- move (sp)+,D1
-
- move LinesInWind(A5),D0
- sub #1,D0
- sub D0,D1
- move D0,D6 ;d6 = how many lines
- ;to scroll!
-
- ;are we going to go before 1st line?
- ;if so, figure how many lines from current position
- ;until 0 (zero) and use that # to scroll text!
- cmp #nil,D1
- bge Not_Past_Begin2
-
- add D1,D6 ;set to proper value
- ;for scroll
- move #nil,D1 ;to set ctrl
-
- Not_Past_Begin2
- move.l WhichControl(A5),-(sp)
- move D1,-(sp)
- _SetCtlValue
-
- bsr Scroll_The_Text
-
- PageUpActionDone
- restoreregs
- unlk A6
- move.l (sp)+,A1
- adda.w #parambytes,SP
- jmp (a1) ;rts
-
-
- ;-------------------------------------------------------------
- ; <<<< Handle PageDown Scroll arrow >>>>
- ;-------------------------------------------------------------
- PageDownActionProc
- ;offsets into A6 stack
- thecontrol set 10
- pcode set 8
- parambytes set 6
-
- link A6,#0
- saveregs
-
- tst pcode(A6)
- beq PageDownActionDone
-
- clr -(sp)
- move.l WhichControl(A5),-(sp)
- _GetCtlValue
- move (sp)+,D7
- move D7,D2
-
- move LinesInWind(A5),D0
- sub #1,D0
- add D0,D2
- neg D0
- move D0,D6 ;d6 = how many lines
- ;to scroll!
-
- ;are we going to go after last line?
- ;if so, figure how many lines from current position
- ;until last line and use that # to scroll text
- clr -(sp)
- move.l WhichControl(A5),-(sp)
- _GetMaxCtl
- move (sp)+,D3 ;to set ctrl
-
- cmp D3,D2
- ble Not_Past_End
-
- sub D3,D7 ;set to proper value
- move D7,D6 ;for scroll
- move D3,D2 ;to set ctrl
-
- Not_Past_End
- move.l WhichControl(A5),-(sp)
- move D2,-(sp)
- _SetCtlValue
-
- bsr Scroll_The_Text
-
-
- PageDownActionDone
- restoreregs
- unlk A6
- move.l (sp)+,A1
- adda.w #parambytes,SP
- jmp (a1) ;rts
-
-
-
-
- ;-------------------------------------------------------------
- ; <<<< Do the actual text scrolling >>>>
- ;-------------------------------------------------------------
- Scroll_The_Text
- ;d6 has how many lines and which direction to scroll
- ;(depending on whether the value is pos. or neg.)
- ;use teLineHite to figure how many pixels to scroll
- ;by multiplying it with the amount of lines
- clr.l D2
- move.l TextHand(A5),A2
- move.l (A2),A2
- move teLineHite(A2),D2
- muls D6,D2
-
- move #nil,-(sp) ;no horiz. scroll
- move D2,-(sp) ;vert. scroll
- move.l TextHand(A5),-(sp)
- _TESCroll
-
- rts
-
- ;-------------------------------------------------------------
- ; <<<< END of all text scrolling routines >>>>
- ;-------------------------------------------------------------
-
-
-
-
- ;-------------------------------------------------------------
- ; <<<< How many text lines can fit in user item rect >>>>
- ;-------------------------------------------------------------
- Calc_Lines_In_One_Windowful
- saveregs
-
- bsr Get_Rect_Of_Item
-
- clr.l D4
-
- lea DispRect(A5),A2
- move Top(A2),D3
- move Bottom(A2),D4
- sub D3,D4 ;Top-Bottom = how many
- ;pixels in text view box
- ;D4= heighth (in pixels)
- ;of help window
-
- clr.l D5
- move.l TextHand(A5),A2
- move.l (A2),A2
- move teLineHite(A2),D5 ;rect heighth
- divu D5,D4 ;divided by the
- ;heighth of one
- ;line of text =
- ;how many lines
- ;can fit!
-
- ;D4 now = how many lines of text can fit into one
- ;screen of the user item of the dialog box!
- move D4,LinesInWind(A5)
-
- restoreregs
- rts
-
-
-
- ;-------------------------------------------------------------
- ; <<<< Erase inside of user item rect of dialog >>>>
- ;-------------------------------------------------------------
- Erase_Rect
- ;erase entire user item rectangle
- bsr Get_Rect_Of_Item
-
- pea DispRect(A5)
- _EraseRect
-
- rts
-
-
-
- ;-------------------------------------------------------------
- ; <<<< Get user item rect of dialog >>>>
- ;-------------------------------------------------------------
- Get_Rect_Of_Item
- ;Get info from User Item #2
- move.l DialogPtr(A5),-(SP)
- move #2,-(sp)
- pea ItemType(A5)
- pea ItemHandle(A5)
- pea DispRect(A5)
- _GetDItem
-
- rts
-
-
-
- ;-------------------------------------------------------------
- ; <<<< Change button to say 'Done Viewing' >>>>
- ;-------------------------------------------------------------
- Set_To_DoneViewing
- bsr Get_Button_Handle
- move.l ItemHandle(A5),-(sp)
- pea DoneViewing
- _SetCTitle
- rts
-
-
- ;-------------------------------------------------------------
- ; <<<< Change button to say 'Done with Help' >>>>
- ;-------------------------------------------------------------
- Set_To_DoneWithHelp
- bsr Get_Button_Handle
- move.l ItemHandle(A5),-(sp)
- pea DoneString
- _SetCTitle
- rts
-
-
-
- ;-------------------------------------------------------------
- ; <<<< Get handle of button in dialog >>>>
- ;-------------------------------------------------------------
- Get_Button_Handle
- ;Get the buttons handle (for changing the buttons
- ;title)
- move.l DialogPtr(A5),-(SP)
- move #1,-(sp)
- pea ItemType(A5)
- pea ItemHandle(A5)
- pea DispRect(A5)
- _GetDItem
- rts
-
-
-
- ;-------------------------------------------------------------
- ; <<<< Get watch CURSor and display it >>>>
- ;-------------------------------------------------------------
- GetandSetWatch
- clr.l -(sp)
- move #watchcursor,-(sp)
- _GetCursor
- move.l (sp)+,A0
- move.l (A0),-(sp)
- _SetCursor
- rts
-
-
-
- ;-------------------------------------------------------------
- ; <<<< Frame the user item rect of dialog >>>>
- ;-------------------------------------------------------------
- Frame_The_Rect
- ;frame the outside of the user items rectangle
- bsr Get_Rect_Of_Item
- pea DispRect(A5) ;Inset rect by 1
- move #-1,-(sp) ;outward
- move #-1,-(sp)
- _InSetRect
-
- pea DispRect(A5)
- _FrameRect
- rts
-
-
-
- ;-------------------------------------------------------------
- ; <<<< Hilight A Dialog Button >>>>
- ;-------------------------------------------------------------
- ;this routine expects parameters to be on the stack
- ;PROCEDURE HilightDialogButton (WPtr: Ptr; WhichItem: Int)
- ;Will hilight a button in a dialog box
- HilightDialogButton
- WindPt SET 10
- WhichItem SET 8
- parambytes SET 6
-
- ;local variables
- TheType SET -4 ;Vars for _GetDItem
- TheHandle SET -8 ;handle
- TheRect SET -16 ;item rect
- localbytes SET -16 ;for link
-
- link A6,#localbytes
- saveregs
-
- move.l WindPt(A6),-(SP)
- _SetPort
-
- move.l WindPt(A6),-(SP)
- move WhichItem(A6),-(sp)
- pea TheType(A6)
- pea TheHandle(A6)
- pea TheRect(A6)
- _GetDItem
-
- move #3,-(sp)
- move #3,-(sp)
- _PenSize
-
- pea TheRect(A6)
- move #-4,-(sp)
- move #-4,-(sp)
- _InSetRect
-
- pea TheRect(A6)
- move #16,-(sp)
- move #16,-(sp)
- _FrameRoundRect
-
- move #1,-(sp)
- move #1,-(sp)
- _PenSize
-
- restoreregs
- unlk A6
- move.l (sp)+,A0
- adda #parambytes,SP
- jmp (A0) ;rts
-
-
-
-
- ;-------------------------------------------------------------
- ; <<<< Set up the dialog box with the help info >>>>
- ;-------------------------------------------------------------
- SetUpHelpList
- saveregs
-
- bsr Calc_Cell_Width
-
- bsr Get_Rect_Of_Item
-
- ;must allow room for the lists scroll bar on the right
- ;side so subtract 15 from the rects right side!
- lea DispRect(A5),A1
- sub #15,right(A1)
-
- ;set up the arrayrect (for the cells rows and columns)
- ;for the List Mgr
- lea arrayrect(A5),a0
- move.l #0,(A0)+
- move #arrayRows,(A0)+
- move #arraycolumns,(A0)+
- move #celldepth,D0
- swap D0
- move cellWidth(A5),D0
-
- ;create a new List
- clr.l -(sp)
- pea DispRect(A5) ;list rect!
- pea arrayrect(A5)
- move.l D0,-(sp) ;cell size
- move #0,-(sp) ;res id of proc.
- move.l DialogPtr(A5),-(sp) ;window ptr
- move.w #false,-(sp) ;draw it?
- move #false,-(sp) ;has grow?
- move #false,-(sp) ;horiz scroll?
- move #true,-(sp) ;vert scroll?
- _LNew
- move.l (sp)+,ListHandle(A5)
-
- ;set selflags to allow only one selection at a time!
- move.l ListHandle(A5),A0
- move.l (A0),A0
- move.b #128,selFlags(A0)
-
- ;put all the 'help' names (topics) into the list
- bsr AddHelpNamesToList
-
- restoreregs
- rts
-
-
-
- ;-------------------------------------------------------------
- ; <<<< Calculate cell width for list manager >>>>
- ;-------------------------------------------------------------
- Calc_Cell_Width
- bsr Get_Rect_Of_Item
-
- move DispRect+right(A5),D2
- move DispRect+left(A5),D3
- sub D3,D2
- sub #16,D2 ;allow for scroll
-
- move D2,cellwidth(A5) ;return value
-
- rts
-
-
-
- ;-------------------------------------------------------------
- ; <<<< Add 'help' resource names to List >>>>
- ;-------------------------------------------------------------
- AddHelpNamesToList
- ;this is a routine to add all 'help' resource names
- ;to a list
-
- saveregs
-
- clr -(sp)
- move.l #'help',-(sp)
- _CountResources
- move (sp)+,D4 ;how many there are
- move D4,D7
- beq None_Here ;if no 'help' res's
- ;here, quit!
- sub #1,D4 ;sub 1 for looping
- ;(the DBRA later)
-
- move #false,-(sp) ;set drawing off
- move.l ListHandle(A5),-(sp)
- _LDoDraw
-
- move.l #nil,TheCell(A5) ;start with zero cell
-
- ;set ResLoad off (so resources are not
- ;automatically read into memory)
- move #false,-(sp)
- _SetResLoad
-
- AddhelpLoop
- clr.l -(sp)
- move.l #'help',-(sp)
- move D7,-(sp) ;res. id #
- _GetResource
- move.l (sp),A4 ;leave handle on stack
- ;for next routine
-
- ;get the resources name
- pea ResId(A5)
- pea ResType(A5)
- pea ResName(A5)
- _GetResInfo
-
- lea ResName(A5),A3
- clr.l D3
- move.b (A3)+,D3 ;how many chars in
- ;name for later
-
- sub #1,D7 ;decrement index #
- ;D7 = the res id#
-
- ;d3 = how many characters in string,
- ;A3 = ptr to string data
- ;add a new row
- clr -(sp)
- move #1,-(sp)
- move #0,-(sp)
- move.l ListHandle(A5),-(sp)
- _LAddRow
- move (sp)+,D0
-
- ;set the cells data to the resources name
- move.l A3,-(sp) ;points to name
- move D3,-(sp) ;how many chars?
- move.l TheCell(A5),-(sp)
- move.l ListHandle(A5),-(sp)
- _LSetCell
-
- dbra D4,AddhelpLoop ;loop until D4 = 0
-
- ;set ResLoad back on
- move #true,-(sp)
- _SetResLoad
-
- move #true,-(sp) ;turn drawing on
- move.l ListHandle(A5),-(sp)
- _LDoDraw
-
- ;update the list to show it
- MOVE.L DialogPtr(A5),A1
- move.l 24(A1),-(sp)
- move.l ListHandle(A5),-(sp)
- _LUpdate
-
- bsr Frame_The_Rect
-
- None_Here
- restoreregs
- rts
-
-
-
-
- ;-------------------------------------------------------------
- ; <<<< Constants >>>>
- ;-------------------------------------------------------------
- DoneString dc.b 14,'Done with Help'
- .align 2
-
- DoneViewing dc.b 12,'Done viewing'
- .align 2
-
-
-
- ;-------------------------------------------------------------
- ; <<<< Global variables >>>>
- ;-------------------------------------------------------------
- WhichControl ds.l 1 ;used by _FindControl
- TextHand ds.l 1 ;TE record Handle
- ScrollHand ds.l 1 ;Handle of scroll bar
- DialogPtr ds.l 1 ;Ptr to Help Dialog
- LinesInWind ds 1 ;how many text lines fit in rect
- AString ds.b 256 ;Space for a string
-
- ListHandle ds.l 1 ;Handle to list
- TheCell ds.l 1 ;Used by the List Mgr
- ArrayRect ds.l 2 ;Rows & columns for List Mgr
- cellwidth ds.w 1 ;width of cell in list
- DataLength ds.w 1 ;Var used by _LGetCell
-
- ItemType ds.l 1 ;Vars used by _GetDItem
- ItemHandle ds.l 1 ;Handle of Dialog Item
- DispRect ds.l 2 ;Rect of Dialog Item
-
- ResHand ds.l 1 ;Handle of a 'help' resource
-
- ResId ds.w 1 ;Vars used by _GetResInfo ID#
- ResType ds.l 1 ;res. type
- ResName ds.b 256 ;res. name
-
- ItemNumber ds.w 1 ;Item# returned by _ModalDialog
-
- END
-